<?php
declare (strict_types = 1);

namespace app\command;

use app\admin\model\TaskQueueModel;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use Workerman\Worker;
use Workerman\Crontab\Crontab;

class TaskQueue extends Command
{
    protected $timer;
    /**
     * @var int|float
     */
    protected $interval = 2;
    protected function configure()
    {
        // 指令配置
        $this->setName('timer')
            ->addArgument('status', Argument::REQUIRED, 'start/stop/reload/status/connections')
            ->addOption('d', null, Option::VALUE_NONE, 'daemon（守护进程）方式启动')
            ->addOption('i', null, Option::VALUE_OPTIONAL, '多长时间执行一次')
            ->setDescription('开启/关闭/重启 定时任务');
    }
    protected function init(Input $input, Output $output)
    {
        global $argv;
        if ($input->hasOption('i'))
            $this->interval = floatval($input->getOption('i'));
        $argv[1] = $input->getArgument('status') ?: 'start';
        if ($input->hasOption('d')) {
            $argv[2] = '-d';
        } else {
            unset($argv[2]);
        }
    }
    protected function execute(Input $input, Output $output)
    {
        $this->init($input, $output);
        //创建定时器任务
        $task = new Worker();
        $task->count = 1;
        $task->name = "任务队列";
        $task->onWorkerStart = [$this, 'start'];
        $task->runAll();
    }
    public function stop()
    {
        //手动暂停定时器
        \Workerman\Lib\Timer::del($this->timer);
    }
    public function start()
    {
        new Crontab('1 * * * * *', function(){
            $this->checkQueue();
        });
        new Crontab('31 * * * * *', function(){
            $this->checkQueue();
        });

    }
    public function checkQueue()
    {
        $task = TaskQueueModel::where('status','=',1)->find();
        if(!empty($task))
        {
            return false;
        }
        $task = new TaskQueueModel();
        $task = $task->where('status','=',0)->find();
        if(!empty($task))
        {
            $task->status = 1;
            $task->save();
            switch ($task->task)
            {
                case "ShopPersonStatistics":{
                    $shopIds = explode(",",$task->shop_id);
                    $shopPersonStatistics = new ShopPersonStatistics();
                    $res = $shopPersonStatistics->setShopPersonStatistics($shopIds);
                    if($res)
                    {
                        $task->status = 2;
                        $task->save();
                    }
                    break;
                }
            }
        }
    }
}
